/**
 * 扁平化
 * 数组的扁平化，就是将一个嵌套多层的数组 array (嵌套可以是任何层数)转换为只有一层的数组。
 * 举个例子，假设有个名为 flatten 的函数可以做到数组扁平化，效果就会如下：
 * 
 * var arr = [1, [2, [3, 4]]];
 * console.log(flatten(arr)) // [1, 2, 3, 4]
 * 
 */
// 1.递归方式
var arr = [1, [2, [3, 4]]];

function flatten(arr){
  var result = [];
  for(var i = 0, len = arr.length; i< len; i++){
    if(Array.isArray(arr[i])){
      result = result.concat(flatten(arr[i]));
    }else {
      result.push(arr[i]);
    }
  }
  return result;
}

console.log(flatten(arr));

// 2.toString
// 如果数组的元素都是数字，那么我们可以考虑使用 toString 方法，因为：
// [1, [2, [3, 4]]].toString() // "1,2,3,4"
// 方法2
var arr = [1, [2, [3, 4]]];

function flatten(arr) {
    return arr.toString().split(',').map(function(item){
        return +item
    })
}

console.log(flatten(arr));
// 然而这种方法使用的场景却非常有限，如果数组是 [1, '1', 2, '2'] 的话，这种方法就会产生错误的结果。


// 3.reduce
var arr = [1, [2, [3, 4]]];
function flatten(arr){
  return arr.reduce(function(prev, next){
    return prev.concat(Array.isArray(next) ? flatten(next) : next)
  });
}
console.log(flatten(arr));

// ES6扩展运算符
// var arr = [1, [2, [3, 4]]];
// console.log([].concat(...arr));

var arr = [1, [2, [3, 4]]];
function flatten(arr){
  while(arr.some(item => Array.isArray(item))){
    arr = [].concat(...arr);
  }
  return arr;
}
console.log(flatten(arr));